package com.dt.web.controller.dataimport;

import com.dt.common.core.controller.BaseController;
import com.dt.common.core.domain.AjaxResult;
import com.dt.common.utils.DateUtils;
import com.dt.system.domain.*;
import com.dt.system.service.*;
import com.dt.web.excel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import com.alibaba.excel.EasyExcel;

import java.io.File;
import java.text.Collator;
import java.util.*;
import java.util.stream.Collectors;


/**
 * 导入excel到档案系统
 *
 * @author yxg
 * @date 2024-01-26
 */
@RestController
@RequestMapping("/dataimport")
public class DataImportController extends BaseController {

    @Autowired
    private IModSignLogService signLogService;  //签收服务

    @Autowired
    private IModFileService fileService;  //档案服务


    @Autowired
    private IModRepositoriesBoxService repositoriesBoxService;  //盒子服务


    @Autowired
    private IModFileImageCatalogService fileImageCatalogService;  //影像目录服务

    @Autowired
    private IModFileImageService fileImageService;  //影像服务


    @Value("${panfu:e}")
    private String panfu;


    @Value("${file.root:E:/40}")
    private String fileRoot;





    /**
     * 导入库房
     */
    @GetMapping(value = "/kuFang")
    public AjaxResult importKuFang() {
        String fileName = panfu + ":/kufang.xlsx";
        // 这里 只要，然后读取第一个sheet 同步读取会自动finish
        EasyExcel.read(fileName, new RepositoriesDataListener()).sheet().doRead();
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }

    /**
     * 导入库架
     */
    @GetMapping(value = "/kuJia")
    public AjaxResult importKuJia() {
        String fileName = panfu + ":/kujia.xlsx";
        // 这里 只要，然后读取第一个sheet 同步读取会自动finish
        EasyExcel.read(fileName, new RepositoriesShelvesDataListener()).sheet().doRead();
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }

    /**
     * 导入层格
     */
    @GetMapping(value = "/cengGe")
    public AjaxResult importCengGe() {
        String fileName = panfu + ":/cengge.xlsx";
        // 这里 只要，然后读取第一个sheet 同步读取会自动finish
        EasyExcel.read(fileName, new RepositoriesLayerDataListener()).sheet().doRead();
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }

    /**
     * 导入盒子
     */
    @GetMapping(value = "/heZi")
    public AjaxResult importHeZi() {
        String fileName = panfu + ":/hezi.xlsx";
        // 这里 只要，然后读取第一个sheet 同步读取会自动finish
        EasyExcel.read(fileName, new RepositoriesBoxDataListener()).sheet().doRead();
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }


    /**
     * 导入签收
     */
    @GetMapping(value = "/qianShou")
    public AjaxResult importQianShou() {
        File dir = new File(fileRoot);
        //获取这个目录下所有的子文件和子目录的数组。
        File[] rootFiles = dir.listFiles();


        //遍历所有目录
        if (rootFiles != null) {

            //对文件夹名称排序
            Arrays.sort(rootFiles, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    String fName1 = f1.getName().split("-")[1].trim();
                    String fName2 = f2.getName().split("-")[1].trim();
                    int fNum1=Integer.parseInt(fName1);
                    int fNum2=Integer.parseInt(fName2);
                    return Integer.compare(fNum1,fNum2);
                }
            });

            //第一级目录：B1-1898
            for (File rootFile : rootFiles) {

                if (!rootFile.isFile()) {
                    File[] qianshouFiles = rootFile.listFiles();
                    if (qianshouFiles != null) {

                        List<ModSignLog> dataList=new ArrayList<>();
                        //第二级目录 202228279621
                        for (File qianshouFile : qianshouFiles) {
                            //写入数据库
                            ModSignLog modSignLog = new ModSignLog();
                            modSignLog.setCategoryId(1L);
                            //签收人名称
                            modSignLog.setReceiverUserName("房文忠");
                            //交付人名称
                            modSignLog.setTransferName("庄杰兴");
                            //签收时间
                            modSignLog.setReceiverTime(DateUtils.getNowDate());
                            //收建编号
                            modSignLog.setReceiverNo(qianshouFile.getName());

                            //查询数据是否存在，如果不存在，则新增，存在则忽略
                            ModSignLog temp=new ModSignLog();
                            temp.setReceiverNo(qianshouFile.getName());
                            List<ModSignLog> mslst = signLogService.selectModSignLogList(temp);
                            if(mslst==null || mslst.isEmpty())
                            {
                                dataList.add(modSignLog);
                            }
                        }
                        if(!dataList.isEmpty()){
                            signLogService.batchInsertModSignLog(dataList);
                        }

                    }
                }
            }
        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }


    /**
     * 导入档案
     */
    @GetMapping(value = "/dangAn")
    public AjaxResult importDangAn() {
        File dir = new File(fileRoot);
        //获取这个目录下所有的子文件和子目录的数组。
        File[] rootFiles = dir.listFiles();

        //遍历所有目录
        if (rootFiles != null) {

            //对文件夹名称排序
            Arrays.sort(rootFiles, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    String fName1 = f1.getName().split("-")[1].trim();
                    String fName2 = f2.getName().split("-")[1].trim();
                    int fNum1=Integer.parseInt(fName1);
                    int fNum2=Integer.parseInt(fName2);
                    return Integer.compare(fNum1,fNum2);
                }
            });

            //第一级目录：B1-1898
            for (File rootFile : rootFiles) {

                if (!rootFile.isFile()) {
                    //获取盒子编号
                    String BoxNo = rootFile.getName();
//                    String BoxNo = dirName.split("-")[1].trim();


                    File[] qianshouFiles = rootFile.listFiles();
                    if (qianshouFiles != null) {

                        List<ModFile> dataList=new ArrayList<>();
                        //第二级目录 202228279621
                        for (File qianshouFile : qianshouFiles) {
                            //写入数据库
                            ModFile modFile = new ModFile();
                            //设置收件编号
                            modFile.setReceiverNo(qianshouFile.getName());
                            //设置档案编号
                            modFile.setFileNo(qianshouFile.getName());
                            //设置盒子ID
                            modFile.setBoxNo(BoxNo);
                            //设置影像状态
                            modFile.setImageStatus("1");

                            //根据盒子编号查询库房ID、库架ID、层格ID、盒子ID
                            ModRepositoriesBox modRepositoriesBox = new ModRepositoriesBox();
                            modRepositoriesBox.setBoxNo(BoxNo);
                            List<ModRepositoriesBox> Boxlst = repositoriesBoxService.selectModRepositoriesBoxList(modRepositoriesBox);
                            if (!Boxlst.isEmpty()) {
                                //设置库房ID
                                modFile.setRepositoriesId(Boxlst.get(0).getRepositoriesId());
                                //设置库架ID
                                modFile.setShelvesId(Boxlst.get(0).getShelvesId());
                                //设置层格ID
                                modFile.setLayerId(Boxlst.get(0).getLayerId());
                                //设置盒子ID
                                modFile.setBoxId(Boxlst.get(0).getId());
                            }


                            //根据签收编号。查询签收ID
                            ModSignLog modSignLog = new ModSignLog();
                            modSignLog.setReceiverNo(qianshouFile.getName());
                            List<ModSignLog> Signlst = signLogService.selectModSignLogList(modSignLog);
                            if (!Signlst.isEmpty()) {
                                //设置签收ID
                                modFile.setSignId(Signlst.get(0).getId());
                            }

                            //查询数据是否存在，如果不存在，则新增，存在则忽略
                            ModFile temp = new ModFile();
                            temp.setFileNo(qianshouFile.getName());
                            List<ModFile> mflst = fileService.selectModFileList(temp);
                            if(mflst==null || mflst.isEmpty())
                            {
                                dataList.add(modFile);
                            }

                        }

                        if(!dataList.isEmpty()){
                            fileService.batchInsertModFile(dataList);
                        }



                    }
                }
            }
        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }


    /**
     * 导入目录
     */
    @GetMapping(value = "/muLu")
    public AjaxResult importImageCatalog() {
        File dir = new File(fileRoot);
        //获取这个目录下所有的子文件和子目录的数组。
        File[] rootFiles = dir.listFiles();

        //遍历所有目录
        if (rootFiles != null) {
            //对文件夹名称排序
            Arrays.sort(rootFiles, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    String fName1 = f1.getName().split("-")[1].trim();
                    String fName2 = f2.getName().split("-")[1].trim();
                    int fNum1=Integer.parseInt(fName1);
                    int fNum2=Integer.parseInt(fName2);
                    return Integer.compare(fNum1,fNum2);
                }
            });
            //第一级目录：B1-1898
            for (File rootFile : rootFiles) {

                if (!rootFile.isFile()) {

                    File[] qianshouFiles = rootFile.listFiles();
                    if (qianshouFiles != null) {


                        List<ModFileImageCatalog> dataList=new ArrayList<>();

                        //第二级目录 202228279621
                        for (File qianshouFile : qianshouFiles) {
                            //目录排序数字
                            Long sortNum = 0L;

                            //档案编号
                            String FileNo = qianshouFile.getName();

                            if (!qianshouFile.isFile()) {

                                //获取第三级目录
                                File[] catalogFiles = qianshouFile.listFiles();
                                if (catalogFiles != null) {

                                    for (File catalogFile : catalogFiles) {
                                        sortNum++;
                                        //写入数据库
                                        ModFileImageCatalog fileImageCatalog = new ModFileImageCatalog();
                                        //设置目录名称
                                        fileImageCatalog.setName(catalogFile.getName());
                                        //设置排序数字
                                        fileImageCatalog.setSort(sortNum);

                                        //根据档案编号。查询档案ID
                                        ModFile modFile = new ModFile();
                                        modFile.setFileNo(FileNo);
                                        List<ModFile> modFileLst = fileService.selectModFileList(modFile);
                                        if (!modFileLst.isEmpty()) {
                                            //设置档案ID
                                            fileImageCatalog.setFileId(modFileLst.get(0).getId());

                                            //查询数据是否存在，如果不存在，则新增，存在则忽略
                                            ModFileImageCatalog temp = new ModFileImageCatalog();
                                            temp.setFileId(modFileLst.get(0).getId());
                                            temp.setName(catalogFile.getName());
                                            List<ModFileImageCatalog> miclst = fileImageCatalogService.selectModFileImageCatalogList(temp);
                                            if(miclst==null || miclst.isEmpty())
                                            {
                                                dataList.add(fileImageCatalog);
                                            }
                                        }


                                    }


                                }

                            }

                        }

                        if(!dataList.isEmpty()){
                            fileImageCatalogService.batchInsertModFileImageCatalog(dataList);
                        }


                    }
                }
            }
        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }


    /**
     * 导入影像
     */
    @GetMapping(value = "/yingXiang")
    public AjaxResult importImage() {
        File dir = new File(fileRoot);
        //获取这个目录下所有的子文件和子目录的数组。
        File[] rootFiles = dir.listFiles();

        //遍历所有目录
        if (rootFiles != null) {

            //对文件夹名称排序
            Arrays.sort(rootFiles, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    String fName1 = f1.getName().split("-")[1].trim();
                    String fName2 = f2.getName().split("-")[1].trim();
                    int fNum1=Integer.parseInt(fName1);
                    int fNum2=Integer.parseInt(fName2);
                    return Integer.compare(fNum1,fNum2);
                }
            });

            long he=0;


            //第一级目录：B1-1898
            for (File rootFile : rootFiles) {

                if (!rootFile.isFile()) {

                    File[] qianshouFiles = rootFile.listFiles();
                    if (qianshouFiles != null) {

                        //第二级目录 202228279621
                        for (File qianshouFile : qianshouFiles) {
                            if (!qianshouFile.isFile()) {

                                //目录排序数字
                                Long sortNum = 0L;


                                //档案编号（收件编号）
                                String fileNo = qianshouFile.getName();
                                //根据档案编号。获取档案ID
                                ModFile modFile = new ModFile();
                                modFile.setFileNo(fileNo);
                                List<ModFile> modFileList = fileService.selectModFileList(modFile);
                                //存放档案id
                                Long fileId = 0L;
                                if (!modFileList.isEmpty()) {
                                    fileId = modFileList.get(0).getId();
                                }


                                //获取第三级目录  身份证明材料、收件回执、目录、封皮等
                                File[] catalogFiles = qianshouFile.listFiles();
                                if (catalogFiles != null) {

                                    //临时存放批量增加的数据
                                    List<ModFileImage> dataList=new ArrayList<>();

                                    for (File  catalogFile : catalogFiles) {

                                        sortNum++;

                                        //获取四级目录  0001.jpg 0002.jpg  0003.jpg
                                        File[] imageFiles = catalogFile.listFiles();
                                        if (imageFiles != null) {
                                            for (File imageFile : imageFiles) {
                                                if(imageFile.getName().contains("Thumbs"))
                                                    continue;
                                                if (imageFile.isFile()) {
                                                    //写数据库
                                                    ModFileImage fileImage = new ModFileImage();
                                                    //上传者ID
                                                    fileImage.setUploadUserId(1L);

                                                    //根据上级目录的目录编号。查询目录表，获取目录id和档案id
                                                    ModFileImageCatalog fileImageCatalog = new ModFileImageCatalog();
                                                    fileImageCatalog.setFileId(fileId);
                                                    fileImageCatalog.setSort(sortNum);
                                                    List<ModFileImageCatalog> imageCatalogList = fileImageCatalogService.selectModFileImageCatalogList(fileImageCatalog);
                                                    if (!imageCatalogList.isEmpty()) {
                                                        //设置档案id
                                                        fileImage.setFileId(fileId);
                                                        //设置目录id
                                                        fileImage.setCatalogId(imageCatalogList.get(0).getId());


                                                    //fileName.substring(0, fileName.lastIndexOf("."))

                                                    String fileName=imageFile.getName();
                                                    //IP地址+盘符+签收日期+目录id+档案文件id
                                                    //fileImage.setImageContent("170.111.111.56+F+2023/8/29+" + fileNo + "+" + sortNum + "+" + fileName.substring(0,fileName.lastIndexOf(".")));
                                                    String imageContent="170.111.111.56+F+2023/8/29+" + fileNo + "+" + imageCatalogList.get(0).getId() + "+" + fileName.substring(0,fileName.lastIndexOf("."));
                                                        fileImage.setImageContent(imageContent);
                                                        //查询数据是否存在，如果不存在，则新增，存在则忽略
//                                                        ModFileImage temp = new ModFileImage();
//                                                        temp.setImageContent(imageContent);
//                                                        List<ModFileImage> miclst = fileImageService.selectModFileImageList(temp);
//                                                        if(miclst==null || miclst.isEmpty())
//                                                        {
                                                            dataList.add(fileImage);
//                                                        }

                                                    }

                                                }

                                            }
                                        }

                                    }
                                    //批量保存到数据库
                                    if(!dataList.isEmpty()){
                                        fileImageService.batchInsertModFileImage(dataList);
                                    }




                                }


                            }


                        }
                    }
                }
            }
        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }


    /**
     * 统计每一盒中档案数量
     */
    @GetMapping(value = "/tongJi")
    public AjaxResult tongJi() {
        String excelPath = panfu + ":/temp.xlsx";

        File dir = new File(fileRoot);

        //获取这个目录下所有的子文件和子目录的数组。
        File[] files = dir.listFiles();

        //遍历所有目录
        if (files != null) {

            List<TotalFileNumber> lst = new ArrayList<>();

            //对文件夹名称排序
            Arrays.sort(files, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    String fName1 = f1.getName().split("-")[1].trim();
                    String fName2 = f2.getName().split("-")[1].trim();
                    int fNum1=Integer.parseInt(fName1);
                    int fNum2=Integer.parseInt(fName2);
                    return Integer.compare(fNum1,fNum2);
                }
            });

            //第一级目录：B1-1898
            for (File file : files) {

                if (!file.isFile()) {
                    //获取盒子编号
                    String BoxNo = file.getName();


                    //记录档案数量
                    int fileNumber = 0;

                    File[] files2 = file.listFiles();
                    if (files2 != null) {
                        //把档案的盒子编号和档案数量写入excel
                        TotalFileNumber totalFileNumber = new TotalFileNumber();
                        totalFileNumber.setFileNo(BoxNo);
                        totalFileNumber.setFileNumber(files2.length);
                        lst.add(totalFileNumber);
                    }

                }
            }

            EasyExcel.write(excelPath, TotalFileNumber.class).sheet("Sheet1").doWrite(lst);


        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }




    /**
     * 测试
     */
    @GetMapping(value = "/cs")
    public AjaxResult ceShi() {

        File dir = new File(fileRoot);

        //获取这个目录下所有的子文件和子目录的数组。
        File[] files = dir.listFiles();

        //遍历所有目录
        if (files != null) {

            //第一级目录：B1-1898
            for (File file : files) {

                if (!file.isFile()) {
                    File[] files1 = file.listFiles();
                    if (files1!=null)
                    {
                        //第二级目录
                        for (File file1 :files1)
                        {

                            if(!file1.isFile())
                            {

                                File[] files2=file1.listFiles();


                                //对文件夹名称排序
                                Arrays.sort(files2, new Comparator<File>() {
                                    @Override
                                    public int compare(File f1, File f2) {

                                        Collator instance = Collator.getInstance(Locale.CHINA);
                                        return instance.compare(f1.getName(), f2.getName());
                                    }
                                });



                                if(files2!=null)
                                {
                                    for (File file2 : files2)
                                    {

                                        System.out.println(file2.getName());

                                    }
                                }




                            }
                        }


                    }




                }
            }
        }
        //返回1 导入成功  返回0 导入失败
        return toAjax(1);
    }






}
